
// 控制器槽

// 获取Email对象
var { Email } = require('../untils/config.js')

// 接着models中的users.js，传入UserModel,包含所有方法save，findLogin等
var UserModel = require('../models/users.js')

var login = async (req,res,next) => {
	// 获取username，password
	var { username , password} = req.body

	// 判断username，password是否匹配数据库的数据，result为true或false（两者均在同一文档document中一一对应）
	// UserModel运用各种各样的方法
	var result = await UserModel.findLogin({
		// data数据
		username,
		password
	})

	// 判断username，password是否匹配数据库的数据，true or false
	if(result){
		// 返回true的话(登录成功)，将username存储在session中
		req.session.username=username
		// 返回的结果有isAdmin属性（models/users.js有UserSchema）,可以打印下result
		// 注意：isAdmin需要手动在数据库上添加，因为从客户端登录时不能手动选择管理员权限，默认都是用户，管理员则需要手动添加（一般需要两个账号测试，一个为管理员，一个为用户）
		req.session.isAdmin=result.isAdmin
		// //打印result查看结构,result其实就是数据库的数据，是一个对象，通过点方法访问属性
		// console.log(result)
		
		res.send({
			msg:'登陆成功',
			status: 0,
		})
	} else {
		res.send({
			msg: '登录失败',
			status: -1
		})
	}
}

var register = async (req,res,next) => {
	// 接收客户端传来的注册信息,request得到的信息是通过post请求完成的，req.body中可以拿到其中的对象属性username, paddword, email, verify
	var { username, password, email, verify } = req.body
	
	// 若填写的email和获取的验证码两者至少一个不符合session状态（缓存），则不能通过验证
	if (email != req.session.email || verify != req.session.verify) {
		res.send({
			msg: '验证码错误',
			status: -1
		})
		// 正确即返回
		return
	} 

	// 接着models中的users.js
	// save方法是models/users.js，save方法返回的结果赋值给result，result为true或false，再进行下面的判断
	// save方法传递一些字符串，只写save方法，具体原理看文档
	var result = await UserModel.save({
		username,
		password,
		email
	})

	if(result) {
		res.send({
			msg: '注册成功',
			status: 0
		})
	} else {
		res.send({
			msg : '注册失败',
			status : -2
		})
	}
}

var verify = async (req,res,next) => {
	// 测试接口（获取验证码）
	// res.send({
	// 	msg:'测试',
	// 	status: 0
	// })

	// 接收email(untils/config.js)
	var email = req.query.email;
	// 接收验证码
	var verify = Email.verify

	// 保证邮箱与验证码一致，两者都存储到session（服务端中）,方便验证
	// req: Request res: Result 
	req.session.email = email
	req.session.verify = verify
	// 现在流行用redis进行缓存


	// 发送的内容mailOptions(具体看nodemailer文档)
	var mailOptions = {
		from: '小天电影 1293964560@qq.com', 	//发件人，指发送验证码的邮箱
		to: email, 	//收件人，指获取验证码的邮箱
		subject: '小天电影邮箱验证码',	//标题
		text: '验证码：' + verify	//文本， 上面var verify = Email.verify ,Email.verify指引入的Email对象中的verify方法，get Verify() {} 可以直接取到对应的值
	}

	// 发送内容(发送这一行为)，内容为mailOptions
	// Email.transporter指的是传入的Email对象的transporter方法,发送完以后，执行回调函数，将前一函数执行的结果err传递到后一函数
	Email.transporter.sendMail(mailOptions,(err) => {
		// 判断，是否有err代表是否失败
		if (err) {
			res.send({
				msg: '验证码发送失败',
				status: -1
			})
		} else {
			res.send({
				msg: '验证码发送成功',
				status: 0
			})
		}
	})
}

var logout = async (req,res,next) => {
	// login登录后，session中存储了username，logout登出操作，把session中的username删除（仅有一个）
	req.session.username = ''
	res.send({
		msg: '退出成功',
		status: 0
	})
}
 
var getUser = async (req,res,next) => {
	//判断是否有username
	if(req.session.username) {
		res.send({
			msg:'获取用户信息成功',
			status: 0,
			// 传递数据到客户端
			data: {
				username: req.session.username,
				// 获取用户信息判断是否为管理员（一般两个号即可）
				isAdmin: req.session.isAdmin
			}
		})
	} else {
		res.send({
			msg: '获取用户信息失败',
			status: -1
		})
	}
}

var findPassword = async (req,res,next) => {
	// 接收来自req.body(客户端传递过来，到服务端)的email,password,verify
	var {email,password,verify} = req.body

	// 判断session中的邮箱与验证码是否对应（具体看verify中获取到验证码后，将email，verify存储在session）
	if (email === req.session.email && verify === req.session.verify ) {
		// 执行models/users.js中的updatePassword方法，返回的结果传递给result，result只能为true或false
		var result = await UserModel.updatePassword(email, password)

		if (result) {
			res.send({
				msg: '密码修改成功',
				status: 0
			})
		} else {
			// 修改密码不成功
			res.send({
				msg: '密码修改失败',
				status: -1
			})
		}
	} else {
		// 验证码与邮箱不是一一对应，这里的status与上面的status，如果result为false，status为-1，如果verify不等于session中的verify，status为-1，两者行为不可能同时发生
		res.send({
			msg: '验证码错误',
			status: -1
		})
	}
}

// 导出为对外接口
module.exports = {
	login,
	register,
	verify,
	logout,
	getUser,
	findPassword
}